
`timescale 1 ns / 10 ps

//  *************************************************************************
//  File : crc32galstep32c
//  *************************************************************************
//  This program is controlled by a written license agreement.
//  Unauthorized Reproduction or Use is Expressly Prohibited. 
//  Copyright [c] 2000 Morethanip
//  info@morethanip.com
//  *************************************************************************
//   Version:    $Id: crc32galstep32c.v,v 1.1 2009/07/09 00:23:23 dk Exp $
//   Author:     Morethanip, Daniel Koehler
//  *************************************************************************
//  Description:
// 
//  24 Bit Galois Field Multiplier
//  *************************************************************************

module crc32galstep32c (

   data,
   crc_in,
   crc_out);
   
input   [31:0] data;            //  new input data
input   [31:0] crc_in;          //  current CRC value
output  [31:0] crc_out;         //  new CRC value

wire    [31:0] crc_out; 
wire    [63:0] i; 
wire    [104:0] o1; 
wire    [31:0] o; 

assign crc_out = o;   

// Level1: Entity: gals26_32_1L1_4
//  --------------

assign i = {data, crc_in}; 

assign o1[0] = i[0] ^ i[2] ^ i[3] ^ i[5];
assign o1[1] = i[22] ^ i[26] ^ i[28] ^ i[29];
assign o1[2] = i[31] ^ i[12] ^ i[15] ^ i[17];
assign o1[3] = i[7] ^ i[2] ^ i[22] ^ i[27];
assign o1[4] = i[30] ^ i[8] ^ i[13] ^ i[26];
assign o1[5] = i[29] ^ i[18] ^ i[19] ^ i[20];
assign o1[6] = i[0] ^ i[23] ^ i[3] ^ i[9];
assign o1[7] = i[14] ^ i[27] ^ i[28] ^ i[30];
assign o1[8] = i[31] ^ i[8] ^ i[19] ^ i[21];
assign o1[9] = i[7] ^ i[6] ^ i[24] ^ i[2];
assign o1[10] = i[10] ^ i[23] ^ i[3] ^ i[16];
assign o1[11] = i[29] ^ i[9] ^ i[15] ^ i[26];
assign o1[12] = i[28] ^ i[31] ^ i[8] ^ i[21];
assign o1[13] = i[25] ^ i[1] ^ i[11] ^ i[6];
assign o1[14] = i[10] ^ i[23] ^ i[24] ^ i[2];
assign o1[15] = i[27] ^ i[17] ^ i[20] ^ i[29];
assign o1[16] = i[9] ^ i[26] ^ i[30] ^ i[57];
assign o1[17] = i[7] ^ i[3] ^ i[10] ^ i[12];
assign o1[18] = i[18] ^ i[24] ^ i[25] ^ i[2];
assign o1[19] = i[11] ^ i[27] ^ i[28] ^ i[30];
assign o1[20] = i[21] ^ i[26] ^ i[31] ^ i[58];
assign o1[21] = i[7] ^ i[0] ^ i[13] ^ i[16];
assign o1[22] = i[23] ^ i[19] ^ i[2] ^ i[12];
assign o1[23] = i[20] ^ i[27] ^ i[28] ^ i[29];
assign o1[24] = i[4] ^ i[22] ^ i[0] ^ i[14];
assign o1[25] = i[24] ^ i[13] ^ i[16] ^ i[23];
assign o1[26] = i[6] ^ i[17] ^ i[30] ^ i[12];
assign o1[27] = i[21] ^ i[28] ^ i[29] ^ i[60];
assign o1[28] = i[5] ^ i[7] ^ i[22] ^ i[18];
assign o1[29] = i[25] ^ i[1] ^ i[15] ^ i[0];
assign o1[30] = i[14] ^ i[24] ^ i[31] ^ i[13];
assign o1[31] = i[23] ^ i[17] ^ i[29] ^ i[30];
assign o1[32] = i[4] ^ i[7] ^ i[22] ^ i[3];
assign o1[33] = i[18] ^ i[25] ^ i[15] ^ i[19];
assign o1[34] = i[14] ^ i[20] ^ i[24] ^ i[31];
assign o1[35] = i[1] ^ i[7] ^ i[25] ^ i[15];
assign o1[36] = i[19] ^ i[22] ^ i[6] ^ i[21];
assign o1[37] = i[8] ^ i[0] ^ i[1] ^ i[2];
assign o1[38] = i[16] ^ i[26] ^ i[20] ^ i[23];
assign o1[39] = i[5] ^ i[4] ^ i[9] ^ i[7];
assign o1[40] = i[8] ^ i[27] ^ i[1] ^ i[2];
assign o1[41] = i[3] ^ i[24] ^ i[17] ^ i[21];
assign o1[42] = i[10] ^ i[4] ^ i[18] ^ i[25];
assign o1[43] = i[8] ^ i[9] ^ i[22] ^ i[28];
assign o1[44] = i[10] ^ i[19] ^ i[26] ^ i[23];
assign o1[45] = i[5] ^ i[11] ^ i[4] ^ i[10];
assign o1[46] = i[27] ^ i[8] ^ i[12] ^ i[20];
assign o1[47] = i[5] ^ i[11] ^ i[0] ^ i[13];
assign o1[48] = i[6] ^ i[7] ^ i[9] ^ i[25];
assign o1[49] = i[3] ^ i[12] ^ i[27] ^ i[37];
assign o1[50] = i[14] ^ i[16] ^ i[2] ^ i[10];
assign o1[51] = i[13] ^ i[28] ^ i[29] ^ i[20];
assign o1[52] = i[11] ^ i[15] ^ i[1] ^ i[4];
assign o1[53] = i[14] ^ i[30] ^ i[10] ^ i[13];
assign o1[54] = i[5] ^ i[18] ^ i[31] ^ i[16];
assign o1[55] = i[2] ^ i[11] ^ i[15] ^ i[25];
assign o1[56] = i[5] ^ i[0] ^ i[19] ^ i[22];
assign o1[57] = i[7] ^ i[8] ^ i[2] ^ i[4];
assign o1[58] = i[5] ^ i[18] ^ i[26] ^ i[9];
assign o1[59] = i[7] ^ i[13] ^ i[21] ^ i[2];
assign o1[60] = i[5] ^ i[6] ^ i[14] ^ i[19];
assign o1[61] = i[22] ^ i[23] ^ i[27] ^ i[1];
assign o1[62] = i[3] ^ i[8] ^ i[10] ^ i[15];
assign o1[63] = i[16] ^ i[28] ^ i[11] ^ i[20];
assign o1[64] = i[23] ^ i[4] ^ i[9] ^ i[15];
assign o1[65] = i[0] ^ i[24] ^ i[29] ^ i[5];
assign o1[66] = i[16] ^ i[17] ^ i[25] ^ i[8];
assign o1[67] = i[0] ^ i[18] ^ i[22] ^ i[17];
assign o1[68] = i[31] ^ i[14] ^ i[27] ^ i[1];
assign o1[69] = i[19] ^ i[26] ^ i[28] ^ i[7];
assign o1[70] = i[10] ^ i[22] ^ i[27] ^ i[48];
assign o1[71] = i[12] ^ i[24] ^ i[5] ^ i[11];
assign o1[72] = i[16] ^ i[23] ^ i[25] ^ i[28];
assign o1[73] = i[2] ^ i[8] ^ i[14] ^ i[49];
assign o1[74] = i[0] ^ i[3] ^ i[13] ^ i[18];
assign o1[75] = i[21] ^ i[24] ^ i[25] ^ i[28];
assign o1[76] = i[30] ^ i[29] ^ i[19] ^ i[26];
assign o1[77] = i[6] ^ i[31] ^ i[0] ^ i[5];
assign o1[78] = i[11] ^ i[15] ^ i[16] ^ i[17];
assign o1[79] = i[6] ^ i[24] ^ i[34];
assign o1[80] = i[3] ^ i[29] ^ i[35];
assign o1[81] = i[26] ^ i[30] ^ i[36];
assign o1[82] = i[12] ^ i[30] ^ i[40];
assign o1[83] = i[13] ^ i[20] ^ i[41];
assign o1[84] = i[4] ^ i[9] ^ i[46];
assign o1[85] = i[7] ^ i[10] ^ i[47];
assign o1[86] = i[18] ^ i[53];
assign o1[87] = i[20] ^ i[55];
assign o1[88] = i[31] ^ i[59];
assign o1[89] = i[30] ^ i[62];
assign o1[90] = i[31] ^ i[63];
assign o1[91] = i[6] ^ i[32];
assign o1[92] = i[23] ^ i[33];
assign o1[93] = i[12] ^ i[38];
assign o1[94] = i[29] ^ i[39];
assign o1[95] = i[21] ^ i[45];
assign o1[96] = i[22] ^ i[51];
assign o1[97] = i[19] ^ i[52];
//
// rerouted inputs that are to be grouped at level 2
//
assign o1[98] = i[42];  // row: 10
assign o1[99] = i[43];  // row: 11
assign o1[100] = i[44];  // row: 12
assign o1[101] = i[50];  // row: 18
assign o1[102] = i[54];  // row: 22
assign o1[103] = i[56];  // row: 24
assign o1[104] = i[61];  // row: 29

// ---------------------------------------------
// Level 2 final outputs
// Level2: Entity: gals26_32_1L2_4

assign o[0] = o1[37] ^ o1[32] ^ o1[91] ^ o1[38];
assign o[1] = o1[40] ^ o1[41] ^ o1[39] ^ o1[92];
assign o[2] = o1[0] ^ o1[42] ^ o1[79] ^ o1[43];
assign o[3] = o1[13] ^ o1[80] ^ o1[39] ^ o1[44];
assign o[4] = o1[9] ^ o1[45] ^ o1[46] ^ o1[81];
assign o[5] = o1[47] ^ o1[49] ^ o1[48] ^ o1[12];
assign o[6] = o1[6] ^ o1[50] ^ o1[93] ^ o1[51];
assign o[7] = o1[52] ^ o1[41] ^ o1[53] ^ o1[94];
assign o[8] = o1[24] ^ o1[55] ^ o1[54] ^ o1[82];
assign o[9] = o1[56] ^ o1[57] ^ o1[2] ^ o1[83];
assign o[10] = o1[24] ^ o1[59] ^ o1[58] ^ o1[98];
assign o[11] = o1[61] ^ o1[62] ^ o1[60] ^ o1[99];
assign o[12] = o1[9] ^ o1[64] ^ o1[63] ^ o1[100];
assign o[13] = o1[65] ^ o1[17] ^ o1[66] ^ o1[95];
assign o[14] = o1[67] ^ o1[13] ^ o1[84] ^ o1[4];
assign o[15] = o1[68] ^ o1[22] ^ o1[58] ^ o1[85];
assign o[16] = o1[52] ^ o1[69] ^ o1[70] ^ o1[25];
assign o[17] = o1[73] ^ o1[71] ^ o1[72] ^ o1[15];
assign o[18] = o1[74] ^ o1[26] ^ o1[11] ^ o1[75] ^ o1[101];
assign o[19] = o1[21] ^ o1[68] ^ o1[42] ^ o1[76] ^ o1[96];
assign o[20] = o1[77] ^ o1[32] ^ o1[78] ^ o1[7] ^ o1[97];
assign o[21] = o1[0] ^ o1[2] ^ o1[86] ^ o1[1];
assign o[22] = o1[3] ^ o1[4] ^ o1[5] ^ o1[102];
assign o[23] = o1[6] ^ o1[8] ^ o1[7] ^ o1[87];
assign o[24] = o1[9] ^ o1[10] ^ o1[12] ^ o1[11] ^ o1[103];
assign o[25] = o1[13] ^ o1[14] ^ o1[16] ^ o1[15];
assign o[26] = o1[18] ^ o1[17] ^ o1[19] ^ o1[20];
assign o[27] = o1[21] ^ o1[13] ^ o1[22] ^ o1[23] ^ o1[88];
assign o[28] = o1[24] ^ o1[26] ^ o1[25] ^ o1[27];
assign o[29] = o1[29] ^ o1[28] ^ o1[30] ^ o1[31] ^ o1[104];
assign o[30] = o1[32] ^ o1[34] ^ o1[33] ^ o1[89];
assign o[31] = o1[0] ^ o1[35] ^ o1[36] ^ o1[90];


endmodule
